package ctr.stage;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Vector;

import javax.swing.JComboBox;
import javax.swing.JRadioButton;

import jdbc.Connexion;
import metier.CategorieStage;
import metier.Stage;
import metier.jdbc.stage.StageJdbc;
import vue.MenuControle;
import vue.commun.JPanJTable;
import vue.commun.JPanOptionTri;
import vue.stage.JPanAffStage;
import configuration.Constante;

public class GestAfficheStage  implements ActionListener{

	private JPanAffStage jpanAffStage;
	private JPanOptionTri jPanOptionTri;
	private Vector<Object> nomColonne= new Vector<Object>(Arrays.asList(new String[] {"nom","date de debut", "date de fin"}));
	
	public GestAfficheStage(JPanAffStage jpanAffStage, JPanOptionTri jPanOptionTri){
		this.jPanOptionTri = jPanOptionTri;
		this.jpanAffStage = jpanAffStage;
	}
	
	@Override
	public void actionPerformed(ActionEvent e) {
		if (e.getSource() instanceof JComboBox) {
			afficherTableau();
		}else if (e.getSource() instanceof JRadioButton) {
			triTableau();
		}
	}
	
	/**
	 *  Permet de rechercher les stages à afficher
	 */
	private void afficherTableau(){
		JPanJTable jTable = null;
		//valeurs des lignes
		Vector<Vector<Object>> dataVector= new Vector<Vector<Object>>();
		
		// Recuperation  des stages
		ArrayList<Stage> lStage = StageJdbc.rechercherStageByCategorie(Connexion.getConnexion(), 
				(CategorieStage)jPanOptionTri.getjComboBox().getSelectedItem());
		
		if ( lStage != null && !lStage.isEmpty()){
			Stage.setTri(Constante.TRI_STAGE_NOM);
			Collections.sort(lStage);
			for (Stage stage : lStage) {
				// Creation d'un vector par eleve.
				dataVector.add(stage.getVector());
			}
		}
		if ( jpanAffStage.getPanJTable() != null ){
			jpanAffStage.getPanJTable().getDefaultTableModel().getDataVector().clear();
			jpanAffStage.getPanJTable().getDefaultTableModel().setDataVector(dataVector, nomColonne);
			MenuControle.afficherPan(jpanAffStage);
		}else{
			jTable = new JPanJTable(null, dataVector, nomColonne, null);
			// On affiche la listes des eleves.
			MenuControle.afficherPan(new JPanAffStage(jPanOptionTri, jTable));
		}
	}
	
	/**
	 * Tri le tableau
	 */
	@SuppressWarnings("unchecked")
	private void triTableau(){
		
		Vector<Vector<Object>> dataVector = jpanAffStage.getPanJTable().getDefaultTableModel().getDataVector();
		ArrayList<Stage> lStage = new ArrayList<Stage>();
		// Conversion de la liste de datavector en arrayList pour le tri
		SimpleDateFormat sdf = new SimpleDateFormat(Constante.FORMAT_DATE_SHORT);
		try {
			for (Object object : dataVector) {
				Vector<Object> objetStage = (Vector<Object>) object;
				lStage.add(new Stage(null, 
						(String)objetStage.get(0),
						sdf.parse(objetStage.get(1).toString()),
						sdf.parse(objetStage.get(2).toString()),
						null
						));
			}
		} catch (ParseException e) {
			e.printStackTrace();
		}
		
		if ( jPanOptionTri.getjRbNom().isSelected() ){
			Stage.setTri(Constante.TRI_STAGE_NOM);
			jPanOptionTri.getjRbTriDecroissantPrecedent().setSelected(false);
		}
		if ( jPanOptionTri.getjRbDateDeb().isSelected()){
			Stage.setTri(Constante.TRI_STAGE_DATE_DEB);
			jPanOptionTri.getjRbTriDecroissantPrecedent().setSelected(false);
		}
		
		if ( jPanOptionTri.getjRbTriCroissant().isSelected() ){
			Collections.sort(lStage);
			jPanOptionTri.getjRbTriDecroissantPrecedent().setSelected(false);
		}
		if ( jPanOptionTri.getjRbTriDecroissant().isSelected() && !jPanOptionTri.getjRbTriDecroissantPrecedent().isSelected() ){
			Collections.reverse(lStage);
			jPanOptionTri.getjRbTriDecroissantPrecedent().setSelected(true);
		}
		
		jpanAffStage.getPanJTable().getDefaultTableModel().getDataVector().clear();
		//on reaffecte le liste de  datavector
		for (Stage stage : lStage) {
			// construire un vector representant le stage et l'ajouter au dataVector
			dataVector.add(stage.getVector());
		}
		jpanAffStage.getPanJTable().getDefaultTableModel().setDataVector(dataVector, nomColonne);
		MenuControle.afficherPan(jpanAffStage);
	}
}
